﻿using SqlSugar;

namespace CTP.CRM.Core.SqlSugar.Tools
{
    public static class SqlSugarExpand
    {
        public enum LikeModifier
        {
            Left,
            Right,
            Full
        }

        //
        // 摘要:
        //     sql过滤器，一般用来控制当前sql语句是否参与到当前运算中，同时构建参数化查询防止sql注入
        //
        // 参数:
        //   str:
        //
        //   filter:
        //
        //   value:
        //
        //   sugarParameters:
        //
        //   likeModifier:
        //
        // 异常:
        //   T:System.Exception:
        public static string WhereIF(this string str, bool filter, object value, ref List<SugarParameter> sugarParameters, LikeModifier likeModifier = LikeModifier.Full)
        {
            if (!filter)
            {
                return string.Empty;
            }

            if (sugarParameters == null)
            {
                sugarParameters = new List<SugarParameter>();
            }

            IEnumerable<string> enumerable = from m in str.Split(" ")
                                             where m.StartsWith("@")
                                             select m;
            if (enumerable.Count() <= 0)
            {
                return str;
            }

            foreach (string item in enumerable)
            {
                string parameterName = item.Replace("'", "").Replace("%", "").Replace("(", "")
                    .Replace(")", "")?.Trim();
                if (sugarParameters.Any((SugarParameter m) => m.ParameterName == parameterName))
                {
                    continue;
                }

                if (str.Split(" ").Any((string m) => m.Equals("like", StringComparison.InvariantCultureIgnoreCase)))
                {
                    switch (likeModifier)
                    {
                        case LikeModifier.Left:
                            sugarParameters.Add(new SugarParameter(parameterName, "%" + value));
                            continue;
                        case LikeModifier.Right:
                            sugarParameters.Add(new SugarParameter(parameterName, value?.ToString() + "%"));
                            continue;
                    }

                    sugarParameters.Add(new SugarParameter(parameterName, $"%{value}%"));
                }
                else
                {
                    sugarParameters.Add(new SugarParameter(parameterName, value));
                }
            }

            return str;
        }

        //
        // 摘要:
        //     sql过滤器，一般用来控制当前sql语句是否参与到运算中
        //
        // 参数:
        //   str:
        //
        //   filter:
        public static string WhereIF(this string str, bool filter)
        {
            if (!filter)
            {
                return string.Empty;
            }

            return str;
        }
    }
}
